#coding=utf-8
from numpy import *
from matplotlib import *
import operator

def create_data_set():
    group = numpy.array([[1.0,1.1] , [1.0,1.0], [0,0], [0,0.1]])
    labels = ['A','A1','B','B1']
    return group, labels

def file2matrix(filePath):
    dataFile = open(filePath)
    dataArrayOfLine = dataFile.readlines()
    numberOfLines = len(dataArrayOfLine)

    #构造用于返回的初始化0矩阵
    retMatrix = numpy.zeros((numberOfLines,3))
    #用于返回的标签类别集合列表
    classLableVector = []

    #用来控制给矩阵执行赋值操作
    index=0
    for line in dataArrayOfLine:
        line = line.strip()
        #将行快内容按照退格字符进行分割形成列表数据
        listFromLine = line.split("\t")
        #给下标为index的行所有元素进行赋值操作
        retMatrix[index,:]=listFromLine[0:3]
        classLableVector.append(listFromLine[-1])
        index+=1

    return retMatrix,classLableVector

####执行数据归一化操作，将数据归一化到0-1之间，便于执行计算
def data_normalization(dataSet):




###### 按照指定的输入数据集合进行K临近算法分类，计算与样本集合中的数据的散点距离并基于该距离值的大小进行分类
#@vecX，输入，待分类的向量数据；
#@dataset，输入，用于训练分类器的矩阵数据集；
#@labels，输入，训练数据集的名称；
#@k,输入，指定分类结果的top数
###返回值：
#返回分类结果中最近的元素
def classfiy0(vecX,dataSet,labels,k):
    #获得矩阵的行数量，用于对输入数据进行矩阵化扩展
    datasetSize =dataSet.shape[0]
    #将输入数组扩展到与样本相似的维度，并与样本集矩阵进行减法运算获得各个维度上的距离数据值,tile方法执行矩阵化数据扩展
    diffMat = tile(vecX, (datasetSize, 1)) - dataSet
    print ("diffMat:\n")
    print  (diffMat)

    #求取diffMat的平方
    sqDiffMat = diffMat**2
    print ("sqDiffMat:\n")
    print  (sqDiffMat)

    #将矩阵按照行执行求和运算，axis=0按照列求和，axis=1按照行求和
    sq_distances = sqDiffMat.sum(axis=1)
    print ("sq_distance:\n")
    print (sq_distances)
    #对矩阵执行开平方运算获得实际的距离数据值
    distances = sq_distances ** 0.5
    print ("distances:\n")
    print (distances)

    #获得数组从小到大的索引值
    sortedDistIndicies = distances.argsort()
    print ("sortedDistIndicies:\n")
    print (sortedDistIndicies)

    classCount = {}
    #从距离排序列表中取top k作为候选项
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        #classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
        classCount[voteIlabel] = distances[sortedDistIndicies[i]]
        #对字典值迭代器按照第一个字段指定升序排列，True-降序
        sortedClassCount = sorted(classCount.iteritems(),
                                  key=operator.itemgetter(1), reverse = False)
    print ("classCount:\n")
    print (classCount)
    print ("sortClassCount:\n")
    print (sortedClassCount)

    return sortedClassCount[0][0]





